package com.db.bankapp.service;

import com.db.bankapp.domain.Account;
import com.db.bankapp.domain.Bank;
import com.db.bankapp.domain.Client;

import java.io.*;
import java.util.*;

/**
 * Created by Student on 26.08.2014.
 */
//Выводит количество клиентов банка
public class BankReport {



    public static void getNbOfCustomers(Bank bank) {
        System.out.println("number of clients: " + bank.getClients().size());
    }

    public static void getNbOfAccounts(Bank bank) {
        int i = 0;
        for (Client client: bank.getClients()) {
            for (Account account : client.getAccounts()) {
                i++;
            }
        }
        System.out.println("Number of accounts is equal to " + i);
    }

/*    Выводит списов всех счетов,
    отсортированный по текущему остатку
    счета*/

    public static void getAccountsSortedBySum(Bank bank) {
        List<Account> acc = new ArrayList<>();
        for (Client client : bank.getClients()) {
            acc.addAll(client.getAccounts());
        }
        Collections.sort(acc, new Comparator<Account>() {
            @Override
            public int compare(Account o1, Account o2) {
                return o1.getBalance() - o2.getBalance();
            }
        });
        System.out.println(acc);


    }

/*Вывести суммарную величину кредита,
    взятую клиентами банка. Т.е. сумму всех
    значений, взятых сверх баланса для
    CheckingAccount*/

    public static void getBankCredit(Bank bank) {
        int sum = 0;
        for (Client client : bank.getClients()) {
            sum += client.getSumOverdraft();
        }
        System.out.println("Sum of all overdraft is equal to " + sum);
    }

/*:Map Вывести карту
    Клиент<=>Список_его_Счетов.
    Данный метод несколько «искуственный»
            - клиент уже содержит список своих
    счетов. Цель задачи – научиться
    декларировать сложные структуры
    данных используя generics и выполнять
    преобразование данных
*/

    public static Map<Client, Account> getCustomerAccount(Bank bank) {
        Map<Client, Account> map = new HashMap<>();
        for (Client client : bank.getClients()) {
          //  System.out.println(client + " has the following accounts:");
            for (Account account : client.getAccounts()) {
                map.put(client, account);

            }
        }
        return map;
    }

    public static void statistics(Bank bank) {
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
            System.out.println("Now you can write your commands to report bank statistics");
            while (true) {
                String message = reader.readLine();
                if (message.split(" ")[0].equals("getNbOfCustomers")) {
                    BankReport.getNbOfCustomers(bank);
                } else if (message.split(" ")[0].equals("getNbOfAccounts")){
                    BankReport.getNbOfAccounts(bank);
                } else if (message.split(" ")[0].equals("getAccountsSortedBySum")) {
                    BankReport.getAccountsSortedBySum(bank);
                } else if (message.split(" ")[0].equals("getBankCredit")) {
                    BankReport.getBankCredit(bank);
                } else if (message.split(" ")[0].equals("getCustomerAccount")) {
                    System.out.println(BankReport.getCustomerAccount(bank));
                } else if (message.split(" ")[0].equals("stop")) {
                    System.out.println("Shutting down...");
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


}